| AVReAl | Описание | Адаптеры | History | FAQ | English | Russian |
Программа AVReAl предназначена для программирования микроконтроллеров серии AVR (ATtiny, AT90S, ATmega) фирмы Atmel в режиме ISP (in-cirсuit serial programming, последовательное программирование в схеме). Т.е. на плату устройства устанавливается разъём, к которому подключается шлейф от программатора (подключение адаптеров к микроконтроллеру рассмотрено в разделе "адаптеры"). По окончании процесса программирования снимается сигнал сброса и микроконтроллер начинает выполнять записанную в него программу.
Программа компилируется в следующих вариантах
Для работы Win32 и Linux версий с USB-адаптерами на микросхеме FT2232 необходимо установить соответствующую версию драйверов/библиотеки FTD2XX.
При работе WIN32 версии c адаптерами, подключенными к порту LPT используются
| W95/W98 | - встроенный модуль прямого доступа к портам |
| NT4,W2000,WinXP | - драйвер DLportIO |
DLportIO - драйвер доступа к портам из пакета
DriverLINX
от Scientific Software Tools, Inc.
(http://www.sstnet.com).
В сокращённом виде без описания и множественных примеров применения
можно взять тут dlportio.zip (170KB).
В некоторых случаях могут быть проблемы с установкой сокращённой версии под
WinXP (возможно, начиная с какого-то сервис-пака, так как под WinXPsp1
нормально устанавливался и сокращённый вариант). В таком случае следует
взять полную версию инсталлятора (1.5МБ).
В режиме "fbprg" незадействованные выходы данных LPT могут быть использованы как питание (ключ -ap).
При использовании буферированных адаптеров (Altera ByteBlaster, Atmel STK200 STK300) программа рассчитана на шитьё в плате с "родными" питанием и кварцем.
Также возможна генерация XTAL программой (ключ -o0), данный режим может оказаться полезен и при наличии кварца в плате (LPT-порт легко его пересилит) для "обхода" ошибок кристалов "не читается содержимое EEPROM данных при частотах кварца, близких к максимальной".
Принимает INTEL HEX (avrasm -i). Загружает HEX в память не в массив, а в список. Т.е. различается ситуация "байт 0xFF в .hex" и "неупомянутый байт" В результате есть возможность шить только то, что надо, остальное только проверять при необходимости (см. ключ -v+).
Для любителей корректировать прошивку прямо по HEX-файлу: если не совпадает контрольная сумма
строки, то задается вопрос - "игнорировать?". При ответе 'Y' (или 'y') эта и все
остальные ошибки CSUM игнорируются (но сами символы контрольной суммы должны
присутствовать, иначе программа закончит работу еще раньше по недопустимому символу в
строке).
Для облегчения такого редактирования (особенно "форматных" записей в EEPROM)
реализована возможность, подсмотренная у программы от VMK для
программирования PIC через Tait-совместимое железо: перед анализом строки из нее
убираются пробелы и табуляции. В итоге можно дать:
:08 0001 00 00 01 0203 0405 0 6 0 7 DBТакже игнорируются пустые строки и строки, начинающиеся с символа '#', последнее предназначено для помещения комментариев о версии непосредственно в HEX-файлы.
Проверяется верхний адрес в HEX-файле, если не влазит в опознанный кристалл, то
никаких действий (кроме выдачи сообщения об ошибке) не производится.
Проверяется перекрытие
адресов записей в HEX файле. При нахождении первого перекрытия производится
выход из программы с указанием диапазона адресов перекрывающихся данных.
Для кристаллов с объёмом flash более 64KB необходим расширенный формат HEX-файла (обычный не поддерживает объем больше 64KB). Запись прочитанных данных в файл всегда производится с дополнительными записями тип '04' - Extended Linear Address Record, как не имеющим разночтений. Чтение из HEX-файла записей типа '02' Extended Segment Address Record производится в соответствии с формированием их в AVRASM by Atmel (без предусмотренного документацией Intel сворачивания адреса смещения по модулю 64Kb).
avreal [ключи] [[-c] имя_файла_кода [[-d] имя_файла_данных]] или avreal [ключи] -d имя_файла_данных (когда код трогать желания нет)Если есть только имена файлов, но нет относящихся к ним ключей (-r -w -v), то файлы игнорируются. Подробнее про работу с файлами и про ключи -c, -d рассказано после описания остальных ключей.
Ключи
-h (-?)
avreal +имя -h(
+имя должен быть задан раньше ключа -h)
выдает список fuses, поддерживаемых в режиме ISP для заданного контроллера.
+имя
имя допускается задавать как с префиксом
'AT', так и без него, в том виде, в котором имена выдаются по -h.
Регистр букв не важен. Например, at90usb162, attiny13a, atmega168
либо 90usb162, tiny13a, mega168.
Обязательный ключ, никаких действий по умолчанию не производится.
Если задан только тип (больше нет ни ключей, ни имен файлов), то контроллер будет
сброшен и выдана информация о нем (наличие, если есть доступные по ISP
fuses - их состояние).
-k
-p<device>
s=SERNO,d=DESCRIPTIONv=VID,p=PID
"-pd=Dual RS232 A,s=FT01001A,p=6003"-pd="Dual RS232 A" | для FT2232C, FT2232L, FT2232D |
-pd="Dual RS232-HS A" | для FT2232H |
-pd="Quad RS232-HS A" | для FT4232H |
-p3BC, и в виде -p0x3BC воспринимается как
шестнадцатеричное число. По умолчанию -p2 (LPT2)/dev/parport0/dev/ppi0
Hz, kHz, MHz, например,-o3.686MHZ -o14745600hz -os1500 -os3.8MHzПри отсутствии единиц измерения для совместимости с предыдущими версиями считается, что частота в килогерцах. При отсутствии ключа частота по умолчанию 800 (0.8MHz)
-o0,8Допустимые значения делителя 1..32
-e -w -n если последние 2
байта заняты кодом, то -n игнорируется.<fuselist> выглядит как
fusename=value,fusename=value,bytename=value...
где value - ШЕСТНАДЦАТЕРИЧНОЕ значение без префиксов и суффиксов.
Для однобитовых fuse добавлены значения ON и OFF (прошить и стереть,
0 и 1 соответственно).name=val выдается сообщение об ошибке.
Перечень fusename для конкретного кристалла с диапазоном value и комментарием
можно получить при помощи avreal +chipname -?Для сокращения строки возможно задание полного байта fuses при помощи специальных имен bytename, представляющие собой названия байтов по документации с лидирующим подчерком:
_low,_high,_ext,_lock.
Нереализованные в данном байте биты рекомендуется устанавливать в '1'.
Имя _lock относится к байту lock-битов и BLB, однако на состояние
lock-битов не влияет. Для блокировки кристалла по прежнему надо
использовать ключ -l.
Допускается комбинация отдельных fuse и байтов, однако они при этом
не должны пересекаться, т.е. каждый байт fuses должен быть задан
либо только через специальное имя, либо только через имена отдельных
fuse. Например, допустимо: -f_low=C3,_high=F4,blb2=1
недопустимо: -f_lock=F7,blb2=1
Если работа с fuses по SPI поддерживается, то их состояние сообщается
при любой операции с кристаллом, задание ключа -f необязательно.
Fuses программируются или верифицируются указанием ключа -w
или -v совместно с ключом -f (в том числе в одном сеансе
с программированием/верификацией кода или данных).
-e
независимо от ключа -f).
Группа BLB относится скорее к lock-битам, записать 1 поверх уже
запрограммированной в 0 fuse невозможно. Если запрошена
такая операция и контроллер не стирался, то программа завершает работу
с соответствующим предупреждением.
-fspien=1 (-fspien=off) сотрет SPIEN и запретит дальнейшее
низковольтное программирование. То же произойдет и при
программировании RSTDSBL (-frstdsbl=0 или -frstdsbl=on).
+name) а также если не обнаружен указанный в
командной строке адаптер.
Попытка стереть нераспознанный (возможно просто
залоченный) кристалл при наличии команды стирания производится и без -!,
после чего проводится повторное детектирование типа.
возможны осмысленные комбинации:
-v -w записать, проверить
-e- -w -v+ стереть с сохранением EEPROM, записать, верифицировать
с проверкой на чистоту свободных участков.
-b -w проверить на чистоту, если грязная - выход, иначе писать
Внимание! в связи с усложнением форматов ключей во избежание разночтений
в дальнейшем возможность указывать группу ключей одним аргументом
(например, -ewv) может быть исключена
Порядок ключей не важен, выполнение производится в порядке E B W V L. Если проверка (B, V) дала отрицательный результат, то дальнейшая работа не производится. Т.е.
-e -b -w -v -l2означает: стереть, если стёрлось - писать, если верифицировалась - залочить.
+tiny12 -w -c foo.hex -c*osccal=1f3 -fcksel=3,boden=0Для tiny12 записать во флеш кода файл foo.hex, по адресу байта 0x1F3 занести прочитанное из контроллера значение OSCCAL, запрограммировать fuse boden и установить fuse CKSEL в бинарное значение 0011
-d*name=offset,ext | как байты в EEPROM данных |
-c*name=offset,ext | как байты во FLASH кода (под команду LPM) |
-?name=offset,ext | как часть последовательных команд LDI начиная с offset |
name offset ext
Значение калибровочного байта RC-генератора
В качестве имени используется слово osccal с номером калибровочного байта.
При использовании нулевого байта OSCCAL указание номера 0 не обязательно.
Дополнительный аргумент ext - корректирующее значение к прочитанной
из кристалла
величине OSCCAL (может быть необходимо при напряжении питания, отличающемся
от напряжения калибровки на производстве). При выходе корректированного
значения за пределы [0..255] происходит ограничение значения и выдача
предупреждения.
Примеры.
1. Необходимо записать значение 3-го (считая с 0) байта osccal как байт по адресу
0x3F в EEPROM данных. Используется ключ
-d*osccal3=3F2. Необходимо записать значение 0-го байта osccal, уменьшенное на 3, как часть команды LDI.
public osccal_ldi ... osccal_ldi: ldi R16,0xFF out OSCCAL,R16 ...Далее выясняем по MAP-файлу байтовый адрес метки
osccal_ldi,
например он вышел 0x120. Команда примет вид:
avreal +tiny12 -ewv -c foo.hex -c?osccal=120,-3
serno
с числом - длиной
номера в байтах от 1 до 4. Серийный номер записывается в двоичном виде,
младший байт записывается первым. Дополнительный аргумент ext
- имя текстового
файла, в котором записан номер в десятичном виде. После успешной записи
в кристалл номер увеличивается на 1 и записывается назад в файл.
Файл при этом переписывается полностью, если после серийного номера в нём была
другая информация - она теряется.
При сбое верификации при команде -w -v номер не меняется.
Если в командной строке задана только верификация (без записи), то значение
серийного номера из файла используется, но не инкрементируется,
файл остаётся без изменений.
-d*serno2=12,serno.txt2. Необходимо записать значение 3-байтового серийного номера как часть команд LDI. Номер записан в файле proj.serno
public serno_load ... serno_load: ldi R16,0xFF ; младший байт ldi R17,0xFF ; средний байт ldi R18,0xFF ; старший байтПусть байтовый дрес
serno_load по map-файлу вышел 0x120. Используется ключ:
-c?serno3=120,proj.serno
Произвольная последовательность байтов
Предназначено для записи произвольных данных.
В качестве имени параметра используется слово bytes с числом
записываемых байтов. Дополнительный аргумент ext - шестнадцатеричная
строка, число букв (hex-цифр) должно быть равно удвоенному числу байтов.
Младший байт в hexstr должен быть расположен первым, т.е. для записи числа
0xDEADBEEF надо задать
-c*bytes4=addr,EFBEADDE
Для программирования может быть использован только канал А микросхем FT2232C, FT2232L, FT2232D.
Для FT2232H, FT4232H могут быть использованы каналы A и B. В качестве MOSI, MISO, SCK используются только сигналы аппаратного последовательного интерфейса TDI (adbus1), TDO (adbus2), TCK (adbus0) соответственно, однако при конфигурироваии можно указать инверсию сигнала.
По умолчанию для сигнала RESET используется линия TMS (adbus3), сигнал enable отсутствует.
Для назначения сигналов можно воспользоваться аргументом PINMAP.
Внимание! Начиная с версии 1.28r0 для FT2232 используется полный набор сигналов с управлением полярностью при помощи символа '~'. При этом для сигнала enable используется та же логика, что и для других сигналов. Инверсии, внешние относительно микросхемы, следует указать в записи про сигнал. Это касается в том числе формирователей с активным низким входом разрешения.
Задать экземпляр адаптера можно, указав в ключе -p серийный номер и/или описание канала микросхемы (см. описание ключа -p), для Linux необходимо также указать VID и PID устройства, если они отличаются от VID и PID по умолчанию для микросхем FTDI.
Конфигурирование адаптера осуществляется заданием соответствия сигналов интерфейса программирования выводам адаптера. Аргумент PINMAP соответствующих ключей (-am и -aft2232) может принимать одну из двух форм
=filename, например,
-am=bb2.cfg:configuration_string, например,
-aft2232:enable=~adbus4
Название адаптера (параметр 'name') задаётся записью
name = "произвольная строка"Сигналы программатора (параметры mosi, miso, sck, reset, xtal) задаются записями вида
signal_name = [~]pin_nameПризнак инверсии '~' означает, что между выводом известной программатору части адаптера (разъёма LPT или микросхемы FT2232) и выводом микроконтроллера присутствует инвертор.
| FT2232 | adbus0..adbus7, acbus0..acbus3. |
| FT2232H | dbus0..dbus7, cbus0..cbus7 для обеих каналов. |
| FT4232H | dbus0..dbus7 для каналов A и B, поддерживающих MPSSE. |
| LPT | d0..d7 alf init strobe select ask busy error pe online. Внутренняя инверсия контроллера LPT учитывается автоматически. Внимание! Для выходных сигналов программатора можно использовать только выводы d0..d7 порта LPT. |
Запись key служит для определения вывода и полярности кнопки, запускающей программирование при наличии ключа -k. Инверсия означает активный низкий уровень на входе кнопки.
Существуют специальные группы выводов set, power, enable, led_ok, led_error.
В записях для этих групп допускается перечисление нескольких выводов через запятую.
Признак инверсии при каждом выводе означает, что на вывод необходимо выдать
низкий уровень.
Перед началом работы в заданное (активное) состояние
устанавливаются выводы группы set, сигналы led_ok, led_error устанавливаются в пассивое состояние.
Затем при непустой группе power активируются её выводы и выдерживается пауза около 0.3 секунды, после чего активируются выводы enable.
По окончании работы в зависимости от результата активируются сигналы led_ok либо led_error, в пассивное состояние переводятся выводы enable, затем
выводы power. Выводы set остаются в установленном в начале состоянии.
Cигналы led_ok, led_error следует делать независимыми от линий enable,
иначе они будут отключены и не смогут выполнять свои функции.
Для микросхемы FT2232 выход из битового режиме MPSSE по окончании программирования возвращает канал в основной режим,
прописанй в EEPROM (как правило, UART), поэтому для корректной индикации необходимо
использовать ключ -az.
Поиск файла конфигурации производится в следующей последовательности
Конфигурационная строка состоит из записей, аналогичных записям конфигурационного файла (за исключением записи name), разделённых символом ':'. Завершающий символ не обязателен, при наличии в строке пробелов весь аргумент, как и любой другой аргумент командной строки с пробелами, необходимо заключить в кавычки.
Пример ключа с конфигурационной строкой для адаптера Amontec JTAGkey
С использовеним TMS в качестве RESET
-aft2232:enable=~adbus4С использовеним SRST в качестве RESET (добавляется второй сигнал enable для открывания выхода SRST)
-aft2232:reset=acbus1:enable=~adbus4,~acbus3
Примеры описания LPT-адаптера для системы, состоящей из двух микроконтроллеров AVR, связанных между собой по SPI.
Пусть контролеры соединены следующим образом:

При высокоимпедансном состоянии адаптера программирования или его отсутствии контроллеры могут свободно обмениваться информацией по последовательному интерфейсу.
Для программирования первого микроконтроллера необходимо использовать следующий конфигурационный файл.
name=1'st controller programmer mosi=D6 miso=BUSY sck = D0 reset = D1 enable=~ALF set =~D3Для программирования второго контроллера конфигурация адаптера должна быть следующая.
name=2'nd controller programmer mosi=D6 miso=BUSY set = ~D0 reset = D1 enable=~ALF sck = D3
P.S. При обнаружении неприятностей просьба сообщать версию и
очень желательно копию
расширенной выдачи программы по -% (перенаправив выдачу в файл).
Внимание!!! Письма по поводу avreal с аттачами в виде
скриншотов, WORD-овских и прочеофисовских документов и других способов переслать
1-килобайтный текст с помощью 100-килобайтного файла не будут даже читаться,
не говоря уже об ответах